package qshell

type Cmd struct {
	Key    string
	handle Handle
	next   []*Cmd
}

// ClauseSame 同层添加子句 返回当前子句
func (c *Cmd) ClauseSame(nextkey string, nextHundle Handle) *Cmd {
	_ = c.ClauseNext(nextkey, nextHundle)
	return c
}

// ClauseNext 逐层添加子句 返回下层子句
func (c *Cmd) ClauseNext(nextkey string, nextHundle Handle) *Cmd {
	next := &Cmd{
		Key:    nextkey,
		handle: nextHundle,
		next:   nil,
	}
	c.next = append(c.next, next)
	return next
}

// Do 执行
func (c *Cmd) Do(index *uint, s *Shell, args []string) {
	// 本层为最终层
	if c.next == nil {
		if c.handle == nil {
			s.Println("undefined")
			return
		}
		// 执行命令脚本
		trylog(func() {
			c.handle(s, args)
			*index++
		}, s)
		return
	}
	// 遍历 下层 key
	if len(args) != 0 {
		for _, nextCmd := range c.next {
			if nextCmd.Key == args[0] {
				// 本层无执行可能 执行下层节点
				nextCmd.Do(index, s, args[1:])
				return
			}
		}
	}
	// 下层 key 都不满足
	if c.handle == nil {
		s.Println("undefined")
		return
	}
	// 执行命令脚本
	trylog(func() {
		c.handle(s, args)
		*index++
	}, s)

}
